// 请使用 TypeScript 编写一个函数 uploadImages，接收一个包含图片 URL 的数组作为参数，模拟并发上传图片的任务，并且一次最多并发执行 5 个上传任务。要求在所有图片上传完成后返回一个 Promise，resolve 上传成功的图片数量。
// 要求：
// 1. 使用 fetch 函数模拟上传图片的请求。
// 2. 一次最多并发执行 5 个上传任务，超过并发数的任务需要等待之前的任务完成后再执行。
// 3. 使用 async/await 或者 Promise 的 then/catch 语法均可。

// ploadImages([
//   'https://example.com/image1.jpg',
//   'https://example.com/image2.jpg',
//   'https://example.com/image3.jpg',
//   // ...更多图片 URL
// ])
//   .then(count => console.log(`成功上传了 ${count} 张图片`))
//   .catch(error => console.log(error));

const uploadWorkFactory = (url: string, onSuccess: () => void, onFailed: () => void) => {
  return fetch(url).then(onSuccess).catch(onFailed);
};

const ploadImages = (urls: Array<string>, maxCount: number): Promise<number> => {
  let uploadingCount = 0;

  let leftUrls = [...urls];

  let successNumber = 0;

  return new Promise((resolve) => {
    const workTrigger = () => {
      if (uploadingCount >= maxCount) return;
      const triggerNumber = maxCount - uploadingCount; // 1

      if (leftUrls.length === 0) {
        resolve(successNumber);
        return;
      }

      leftUrls.slice(0, triggerNumber).forEach((url) => {
        uploadingCount++;
        uploadWorkFactory(
          url,
          () => {
            successNumber++;
            uploadingCount--; // 4
            workTrigger();
          },
          () => {
            uploadingCount--;
            workTrigger();
          }
        );
      });

      leftUrls = leftUrls.slice(triggerNumber);
    };

    workTrigger();
  });
};